1. 学前疑问
HTTPS是什么,听过但未了解过,一知半解,趁着这次把他捋一捋,避免一直在知识盲区,目前有以下疑问
- HTTPS是什么
- 其解决了什么问题
- 与HTTP的关系
2. 初步了解
全称 Hypertext Transfer Protocol Secure ,中文名 超文本传输安全协议。在HTTP和TCP中间添加一个加密/身份验证层(SSL层),可以理解是HTTP的安全升级版。
HTTPS的目的是去除中间人,避免中间人攻击。
3. 整体框架
对称加密 + 非对称加密 + CA证书
利用了以上几项结合去实现HTTPS加密机制。接下来会逐步讲解,指明各项优缺点,以及为何需要结合使用。
4. 学习目标
知道其大概实现方式,自己申请域名,并且添加https,实操一番。为以后小程序部署做好基础
5. 详细内容
5.1 对称加密
我们想要对一个内容加密或解密的时候,常常需要使用密码。为了方便与网络通信的名词对应,在后续我们都把密码称为密钥,当加密和解密都使用同一个密钥,那我们把这种加密方式叫作对称加密。
例如:压缩包加解密,压缩时候输入密码,解压时需要输入同一个密码。
/**
* 加密
* @params key 密码或称为密钥
* @params message 通信内容
* @return 加密密文
*/
secret = encrypt(key, message);
/**
* 解密
* @params key 密码或称为密钥
* @params secret 加密密文
* @return 通信内容
*/
plain = decrypt(key, secret);
// 使用同个密钥key进行加解密,称这种加密方式为对称加密。
// 例如:
// 客户端使用 密钥123 对通信内容“你好”进行加密,得到加密密文xxxx
// 加密密文通过网络传输给服务端
// 服务端使用 密钥123 对加密密文xxxx进行解密,得到通信内容“你好”
// 如果是非对称加密,使用的密钥key会不同
在网络通信中,对称加密的使用十分频繁,往往都是客户端在本地新建一个密钥,然后传输给服务端,跟服务端约定好,共同使用这个密钥来加/解密后续传输的内容。因为传输的内容不是明文,没有密钥的人便无法得知内容。
以下为粗略图解
客户端 服务端
|生成密钥 -> 接收密钥 |
...
...
...
|密钥加密 xxx -> 密钥解密 明文|
|密钥解密 明文 <- 密钥加密 xxx |
对称加密使用的是同一个密钥,在加解密时速度很快。但问题在于第一步,如何告知对方密钥,且不会将密钥明文暴露给公共环境。
因为一旦暴露给公共环境,有目的的人拿到该密钥后便能解密传输内容,加密了相当于没加密。为了解决该问题,有以下两种方法:
- 客户端在制造时,直接在本地写入世界上所有服务器和他约定好的密钥。
这种方式显然不可取。虽然从根源上避开密钥在网络传输,但是要写入的数据量实在过大,服务端也无法存下所有客户端的密钥。 - 非对称加密和对称加密结合使用,后面会详细讲。
以上,我们总结下对称加密的特点
- 由于是对称加密,加解密快
- 得知密钥的人,可以加密和解密数据。
- 密钥需要通过公共环境(网络),有暴露风险。
扩展
- 常用对称加密算法有DES、AES和IDEA
- 使用对称加密算法需要指定算法名称、工作模式和填充模式。 阮一峰老师 对称加密1
5.2 非对称加密
在密钥会被拦截的前提下,为了解决对称加密后数据相当于明文传输的问题。非对称加密,可以一定程度解决该问题。
非对称加密,在服务端生成两个密钥,发给客户端的称为公钥,服务端自己保留的称为私钥。公钥加密的内容只能由私钥解密,私钥加密的内容只能用公钥解密。
加密 解密 结果
公钥 公钥 No
公钥 私钥 Yes
私钥 公钥 Yes
私钥 私钥 No
即使公钥通过网络进行明文传输,且被中间人拦截。客户端用公钥加密过的内容,也不会被中间人破解。因为中间人只有公钥,而公钥是无法破解公钥加密的内容,只有私钥可以解密,而私钥还好好地存放在服务端。
这意味着,客户端使用公钥加密的内容,除了服务端拥有私钥可以解密,其他人都无法解密。那么问题来了,公钥大家都拥有,服务端使用私钥加密的内容,拥有公钥的都能进行解密吗?答案是肯定的,拥有公钥的都可以解密。
以上,我们来总结下非对称加密的特点
- 效率慢了许多
- 公钥加密只有私钥能解密,私钥仅服务端拥有,可以保障客户端发送数据时的安全性。
- 私钥加密只有公钥能解密,但是公钥经过网络传输,公钥的拥有者不一定只有目标客户端,拥有公钥的都可以解密,无法保障服务端发送数据的安全性
5.3 非对称加密-升级
根据非对称加密的特点,服务端的私钥加密的内容,公钥可以解密,而公钥通过网络传输可能被拦截。只能保障客户端发送数据的安全性,而无法保障服务端发送数据的安全性。非对称加密-升级可以解决该问题
那如果服务端不使用私钥加密,而是使用另一个加密,是不是就能保障服务端发送数据的安全性?答案是肯定的。
倘若客户端跟服务端一样创建私钥公钥,并将其公钥发给服务端,服务端使用客户端的公钥对数据进行加密后发送,而客户端的私钥仅自己拥有,除了客户端,其它人都无法解密服务端发给客户端的消息。
客户端 服务端
|发送客公钥 -> |
| <- 发送服公钥|
|服公钥加密 -> 服私钥解密|
|客私钥解密 <- 客公钥加密|
以上,我们来总结下非对称加密-升级的特点
- 都是非对称加密,效率慢了许多
- 两端发送数据的安全性都有保障。
5.4 非对称加密 + 对称加密
非对称加密-升级,确实保障了两端发送数据的安全性。但全程使用非对称加密,效率太慢。在两端发送数据安全的前提下,解决加解密效率太慢的问题。可以考虑非对称加密 + 对称加密结合。
加解密慢主要原因是全程使用了非对称加解密,如果可以在保障安全的地方使用非对称加密,其余地方使用对称加密传输数据,那效率会大大提高。
所以出发点落在对称加密上,对称加密的缺点是,密钥明文经网络传输,可能被拦截获取。那如果对密钥进行非对称加密呢?
使用非对称加密,客户端拿到公钥后,使用公钥对对称加密的【密钥】进行加密,并传给服务端。
这样【密钥】就不是明文传输的了。没有私钥的人,也无法得知【密钥】的真实内容,后续用密钥进行对称加密进行传输数据即可。
客户端 服务端
|请求公钥 -> |
| <- 发送公钥|
|公钥加密密钥 -> 私钥解密取密钥|
...
... 后续跟对称加密一致
...
|密钥加密 -> 密钥解密|
|密钥解密 <- 密钥加密|
以上,我们来总结下非对称加密 + 对称加密的特点
- 效率快,除了第一次传递【对称加密的密钥】用的是非对称加密,其余都是对称加密
- 两端发送数据的安全性都有保障。
- 无法避开中间人攻击,后续详细讲
5.5 中间人攻击
非对称加密 + 对称加密已经很完美了,为什么说无法避开中间人攻击,中间人是什么?
中间人:拦截数据,模拟客户端/服务端,骗取信息。以下是模型
客户端 中间人 服务端
|请求公钥 -> |
| <- 发送中间人公钥 |
| 请求服务器公钥 -> |
| <- 发送服务器公钥|
|中间人公钥加密密钥 -> 中间人私钥解密取密钥 |
服务器公钥加密密钥 -> 服务器私钥解密取密钥|
...
... 后续对称加密
...
|密钥加密 -> 密钥解密/密钥加密 -> 密钥解密|
|密钥解密 <- 密钥解密/密钥加密 <- 密钥加密|
可以看出,从客户端一开始请求公钥,便是和中间人对接,拿到中间人的公钥,就跟正常对的服务端的方式一样操作了。对客户端来说,无法感知中间人的存在。
服务端也是一样的,中间人就是他的客户端,服务端也无法感知真正客户端的存在。
在以上对称加密,非对称加密,非对称加密-升级,对称加密+非对称加密的场景下,中间人攻击都能一一攻陷。原因是,中间人攻击是在第一步便介入了,客户端认不清是中间人或服务端。
中间人是在第一步获取公钥的时候便介入,客户端有没有办法在第一步进行识别?只要客户端能识别出中间人不是服务端,便不会与他进行数据交互。那答案肯定是有办法,数据证书就是专门解决这个问题的。
5.6 数字证书
现实生活中坐高铁飞机,如何证明你是你,常用方法是使用公关机关派发的身份证。在网络中,也有一个权威机构,赋值颁发“身份证”,用于标准网站的绝对唯一性,避免冒充。
总结
- 对称加密效率高。
- 非对称加密可以解决对称加密密钥的明文问题。
- 数字证书可以解决中间人攻击
课后疑问
- 对称加密算法需要指定算法名称、工作模式和填充模式。 什么意思
- 对称加密的快 非对称加密的慢,有什么标准吗。怎么形容它的快和慢到哪种程度